# -*- coding: utf-8 -*-
# appengine imports
from google.appengine.ext import db
from google.appengine.api import memcache

#python imports
import cgi, sys, random, hashlib, urllib
from datetime import datetime

#local imports
from baserequesthandler import BesucherHandler
from benutzer.models.schueler import Schueler, Besucher


#todo: memcache irgendwie einbauen?????

class Handler(BesucherHandler):
  def get(self):
    besucher = self.create_besucher() # einen besucher erstellen, der spaetere aufgaben bearbeiten kann
                                      # jetzt den schueler von eben holen, identifiziere anhand des nicknamens
                                      #  
    nickname = self.request.get('nickname')
    fehler = self.request.get('fehler')
    akey = self.request.get('akey')
    schueler = Schueler.gql('where nickname = :1 ', nickname).get()
    if schueler is None and not fehler: # fehler sollten wir dem Benutzer anzeigen, ansonsten weg damit
      self.redirect('/') # weg damit, irgendwas hat nicht geklappt
      return
    elif schueler is not None:
      punktestand = schueler.get_punktestand()
    else: 
      punktestand = 0 # sowieso egal, da es spaeter nicht angezeigt wird, der Fall tritt nur ein
                      # wenn schueler = None UND fehler != ''
    template_values = {
      'nickname': nickname,
      'punktestand': "%0.1f".rjust(7) % punktestand,
      'fehler': fehler,
      'akey': akey
    }


    #self.response.out.write(b.get_punktestand())
    self.generate('benutzer/schueler.html', template_values)

    #self.response.out.write('oh what a beautiful day.')
    return

  def erstelle_schueler(self,nickname, pw):
    """ Erstellt einen neuen Schueler und gibt diesen zurueck.
        Falls der Schueler (sein Nickname) schon vorhanden ist, 
        dann wird None zurueckgegeben.
    """
    schueler = Schueler.gql('WHERE nickname = :1', nickname).get()
    if schueler is None: # wenn es keinen Schueler mit diesem Nicknamen gibt
      schueler  = Schueler(nickname=nickname,pw = pw)
      cv = self.read_cookie('_abid') # cookie lesen
      if cv: # Besucher hat ein Cookie mit Namen '_abid'
        besucher = Besucher.gql('WHERE cookie = :1', cv).get()
        if besucher is not None: # kopieren der wichtigen Daten
          schueler.cookie = besucher.cookie
          schueler.history_GET = [t for t in besucher.history_GET]
          schueler.history_POST = [t for t in besucher.history_POST]
          schueler.put()
          return schueler
        else: # ohne vorher als Besucher angemeldet worden zu sein, darf man nicht speichern
          return None
      else: #ohne Cookie darf man nicht speichern!
        return None

    else:
      return None

  def post(self):
    nickname = cgi.escape(self.request.get('nickname'))
    pw = cgi.escape(self.request.get('pw'))
    speichern = cgi.escape(self.request.get('speichern'))

    nickname_neu = cgi.escape(self.request.get('nickname_neu'))
    pw_1 = cgi.escape(self.request.get('pw_1'))
    pw_2 = cgi.escape(self.request.get('pw_2'))
    speichern_neu = cgi.escape(self.request.get('speichern_neu'))

    akey = self.request.get('akey')
    if speichern_neu and pw_1 == pw_2:
      nickname = nickname_neu # ab hier ist der Nickname nur unter 'nickname' zu finden
      schueler = self.erstelle_schueler(nickname=nickname_neu, pw=pw_1)
      #self.response.out.write('neu speichern')
      #return
    elif speichern:
      schueler = Schueler.gql('WHERE nickname = :1 and pw = :2', nickname, pw).get()
      # schueler uebernimmt cookie von besucher und nicht umgekehrt, dadurch erspart
      # man sich dem besucher ein neues cookie zu uebergeben:
      if schueler is not None: 
        cv = self.read_cookie('_abid') # cookie lesen
        if cv: # Besucher hat ein Cookie mit Namen '_abid'
          besucher = Besucher.gql('WHERE cookie = :1', cv).get()
          if besucher is not None: # kopieren der wichtigen Daten und anhaengen der history-s
            schueler.cookie = besucher.cookie
            schueler.history_GET.extend([t for t in besucher.history_GET])
            schueler.history_POST.extend([t for t in besucher.history_POST])
            schueler.put()
          else: # ohne vorher als Besucher angemeldet worden zu sein, darf man nicht speichern
            self.redirect('/')
            return None
        else: #ohne Cookie darf man nicht speichern!
          self.redirect('/')
          return None
    else: # irgendwas ist bei der Eingabe von Nicknamen & Passwort schief gelaufen
      schueler = None
      
   
    if schueler is None: # Nickname schon vorhanden, oder falsches Passwort oder falscher Nickname
      fehler = "Nickname schon vorhanden oder falsches Passwort oder falscher Nickname!"
    else:
      fehler = ''
    
    # bevor es zur Anzeige der Punkte geht, muss das Cookie im Browser geloescht werden, 
    # damit ein neuer Benutzer angelegt wird:
    self.delete_cookie('_abid')
    self.redirect('/benutzer/s?nickname=%s&fehler=%s&akey=%s' % (nickname,urllib.quote(fehler),akey))
    return
